/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Seguridad.DAO;

import com.dp1.pucp.Modelo.Clases.Usuario;
import com.dp1.pucp.Util.HibernateUtil;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class LoginDAO {

    public void guardarUsuario(Usuario usuario) {
        UsuarioDAO userDAO = new UsuarioDAO();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            if (usuario.getIdusuario() == 0) {
                usuario.setContrasena(userDAO.getStringMessageDigest(usuario.getContrasena()));
            }
            session.saveOrUpdate(usuario);
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
        }
    }

    public Usuario validarUsuario(String login) {
        Usuario usuario = new Usuario();
        login = login.toUpperCase();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            Query query = session.createQuery("from Usuario where upper(usuario) = :login");
            query.setString("login", login);
            List lista = query.list();
            Iterator iter = lista.iterator();
            if (iter.hasNext()) {
                usuario = (Usuario) iter.next();
                Hibernate.initialize(usuario.getIdusuario());
                Hibernate.initialize(usuario.getUsuario());
                Hibernate.initialize(usuario.getContrasena());
                Hibernate.initialize(usuario.getContrasenaAnterior());
                Hibernate.initialize(usuario.getEmpleado());
                Hibernate.initialize(usuario.getEmpleado().getDistrito());
                Hibernate.initialize(usuario.getEstado());
                Hibernate.initialize(usuario.getLogs());
                Hibernate.initialize(usuario.getPerfil());
                Hibernate.initialize(usuario.getUltimaFechaIngreso());
                Hibernate.initialize(usuario.getUltimaModificacion());

            }

        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
        }

        return usuario;
    }

    public ArrayList<Usuario> listarUsuario() {
        ArrayList<Usuario> listaResultados = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            List lista = session.createQuery("from Usuario order by Idusuario").list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                Usuario p = (Usuario) iter.next();
                Hibernate.initialize(p.getIdusuario());
                Hibernate.initialize(p.getUsuario());
                Hibernate.initialize(p.getContrasena());
                Hibernate.initialize(p.getContrasenaAnterior());
                Hibernate.initialize(p.getEmpleado());
                Hibernate.initialize(p.getEstado());
                Hibernate.initialize(p.getLogs());
                Hibernate.initialize(p.getPerfil());
                Hibernate.initialize(p.getUltimaFechaIngreso());
                Hibernate.initialize(p.getUltimaModificacion());
                listaResultados.add(p);
            }
            tx.commit();
        } catch (HibernateException e) {

            throw new HibernateException(e);
        } finally {
            session.close();
            return listaResultados;
        }
    }
}
